/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entidades;

import java.io.*;
import java.math.BigDecimal;
import java.sql.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FlushModeType;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.sql.DataSource;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.joda.time.*;
import org.xml.sax.InputSource;

/**
 *
 * @author danilo
 */
@WebService()
@PersistenceContext(name = "persistence/LogicalName", unitName = "LepucvWebPU")
public class ServicioWeb {

    @Resource
    private javax.transaction.UserTransaction utx;
    @PersistenceUnit(unitName = "LepucvWebPU")
    private EntityManagerFactory emf = null;

    /**
     * Web service operation
     */
    @WebMethod(operationName = "getUser", action = "getUser")
    @SuppressWarnings("static-access")
    public String getUser() throws FileNotFoundException, IOException {
        List<Ensayo> ensayo = null;
        StringBuilder sb = new StringBuilder();
        Connection con = null;
        Statement st = null, stRoles = null, stEnsayos = null;
        ResultSet rs = null, rsRoles = null, rsEnsayos = null;
        String rut = "", rol = "";
        try {
            con = conectarJDBC();
            st = con.createStatement();
            st.executeQuery("select * from usuario");
            rs = st.getResultSet();
            //UsuarioJpaController usuarioJpa = new UsuarioJpaController();
            /*EntityManager em = emf.createEntityManager();
            try {
                utx.begin();
                Query q = em.createQuery("select object(o) from Usuario as o");
                u = q.getResultList();
                utx.commit();
                q = em.createQuery("select object(o) from Rol as o");
                rolTotal = q.getResultList();
            } catch (Exception ex) {
                Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                throw new RuntimeException(ex);
            } finally {
                em.close();
            }*/

            sb.append("<?xml version=\"1.0\"?>");
            sb.append("<usuarios>");
            while(rs.next()){
                rut = rs.getString("rut");
                sb.append("<usuario>");
                sb.append("<rut>" + rut + "</rut>");
                sb.append("<digito>" + rs.getString("digito") + "</digito>");
                sb.append("<primerNombre>" + rs.getString("primerNombre") + "</primerNombre>");
                sb.append("<segundoNombre>" + rs.getString("segundoNombre") + "</segundoNombre>");
                sb.append("<apellidoPaterno>" + rs.getString("apellidoPaterno") + "</apellidoPaterno>");
                sb.append("<apellidoMaterno>" + rs.getString("apellidoMaterno") + "</apellidoMaterno>");
                sb.append("<clave>" + rs.getString("clave") + "</clave>");
                sb.append("<roles>");
                stRoles = con.createStatement();
                stRoles.executeQuery("select usuarioRol.nombre from usuarioRol where usuarioRol.rut = '"+ rut + "'");
                rsRoles = stRoles.getResultSet();
                while(rsRoles.next()) {
                    sb.append("<rol>" + rsRoles.getString("nombre") + "</rol>");
                }
                sb.append("</roles>");
                sb.append("</usuario>");
            }

            st.executeQuery("select * from rol");
            rsRoles = st.getResultSet();

            stEnsayos = con.createStatement();
            while(rsRoles.next()) {
                rol = rsRoles.getString("nombre");

                sb.append("<rol>");
                sb.append("<nombre>" + rol + "</nombre>");
                sb.append("<ensayos>");

                stEnsayos.executeQuery("select codigoEnsayo from rolEnsayo where nombre = '" + rol + "'");
                rsEnsayos = stEnsayos.getResultSet();
                while(rsEnsayos.next()) {
                    sb.append("<codigoEnsayo>" + rsEnsayos.getString("codigoEnsayo") + "</codigoEnsayo>");
                }
                sb.append("</ensayos>");
                sb.append("</rol>");
            }
            sb.append("</usuarios>");

            rs.close();
            rsRoles.close();
            rsEnsayos.close();

            st.close();
            stRoles.close();
            stEnsayos.close();
            /*
            Element nodo;
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(sb.toString());
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("usuario");
            List roles;
            for (int i = 0; i < lista.size(); i++) {
                nodo = (Element) lista.get(i);
                roles = nodo.getChildren("roles");
            }
            */
        } catch (NamingException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        }
        return sb.toString();
    }

    private Connection conectarBD() {
        // MySQL MM JDBC driver
        //String username = "lepucv";
        //String password = "qs2312";
        try {
            Connection connection = null;
            // Load the JDBC driver
            String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver
            // MySQL MM JDBC driver
            Class.forName(driverName).newInstance();
            //String serverName = "afrodita.inf.ucv.cl";
            //String mydatabase = "lepucv";
            String serverName = "localhost";
            String mydatabase = "lepucvRodrigo";
            String url = "jdbc:mysql://" + serverName + "/" + mydatabase; // a JDBC url
            //String username = "lepucv";
            //String password = "qs2312";
            String username = "root";
            String password = "r2d2c3p0luk3";
            try {
                connection = DriverManager.getConnection(url, username, password);
            } catch (SQLException ex) {
                Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
                return null;
            }
            return connection;
        } catch (InstantiationException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (IllegalAccessException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }


    private Connection conectarBD2() {
        // MySQL MM JDBC driver
        //String username = "lepucv";
        //String password = "qs2312";
        try {
            Connection connection = null;
            // Load the JDBC driver
            String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver
            // MySQL MM JDBC driver
            Class.forName(driverName).newInstance();
            //String serverName = "afrodita.inf.ucv.cl";
            //String mydatabase = "lepucv";
            String serverName = "localhost";
            String mydatabase = "lepucv";
            String url = "jdbc:mysql://" + serverName + "/" + mydatabase; // a JDBC url
            //String username = "lepucv";
            //String password = "qs2312";
            String username = "root";
            String password = "r2d2c3p0luk3";
            try {
                connection = DriverManager.getConnection(url, username, password);
            } catch (SQLException ex) {
                Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
                return null;
            }
            return connection;
        } catch (InstantiationException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (IllegalAccessException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    private Connection conectarJDBC() throws NamingException
    {
        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/lepucvDB");
        Connection conn = null;
        try {
            conn = ds.getConnection();
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        }
        return conn;




    }
    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendMuestreoAsfalto")
    public String sendMuestreoAsfalto(@WebParam(name = "formularios") String formularios) throws ParseException, SystemException, NotSupportedException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
        Formulario form;
        MuestreoAsfalto ma;
        OrdenDeTrabajo ot;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        List<OrdenDeTrabajo> ordenesLT;
        Connection con = null;
        Element nodo;
        Statement s;
        ResultSet rs;
        DateTime jodaDT;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("HH:mm:ss");

            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa,estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }

            String tmp;
            for (int i = 0; i < lista.size(); i++) {
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                //ma.setId(form.getId());
                ma = new MuestreoAsfalto();
                tmp = nodo.getChildText("nombreProveedor");
                ma.setNombreProveedor(tmp);
                tmp = nodo.getChildText("lugarProcedenciaAsfalto");
                ma.setLugarProcedenciaAsfalto(tmp);
                tmp = nodo.getChildText("nroGuiaDespacho");
                ma.setNroGuiaDespacho(Integer.parseInt(tmp));
                tmp = nodo.getChildText("tipoAsfalto");
                ma.setTipoAsfalto(tmp);
                tmp = nodo.getChildText("sistemaAcopio");
                ma.setSistemaAcopio(tmp);
                tmp = nodo.getChildText("nroMuestra");
                ma.setNroMuestra(Integer.parseInt(tmp));
                tmp = nodo.getChildText("horaMuestreo");
                String hora = tmp.substring(8);
                ma.setHoraMuestreo(hora);
                tmp = nodo.getChildText("firmado");
                if (tmp.equals("True")) {
                    ma.setFirmado(Boolean.TRUE);
                } else {
                    ma.setFirmado(Boolean.FALSE);
                }
                persist(form);
                ma.setId(form.getId());
                persist(ma);

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera' where id_ensayo = '"+ ensayo_id +"'");
                }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");
            }
        } catch (SecurityException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalStateException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";

    }

    protected void persist(Object object) {
        EntityManager em = null;
        try {
            Context ctx = (Context) new InitialContext().lookup("java:comp/env");
            utx.begin();
            em = (EntityManager) ctx.lookup("persistence/LogicalName");
            em.persist(object);
            utx.commit();
        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", e);
            throw new RuntimeException(e);
        }
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendTomaMuestraSuelo")
    public String sendTomaMuestraSuelo(@WebParam(name = "formularios") String formularios) throws ParseException {
        Formulario form;
        TomaMuestraSuelo tms;
        OrdenDeTrabajo ot;
        List<OrdenDeTrabajo> ordenesLT;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        Connection con = null;
        Element nodo;
        Statement s;
        ResultSet rs;
        DateTime jodaDT;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("HH:mm:ss");

            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa, estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }

            String tmp;
            for (int i = 0; i < lista.size(); i++){
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                //ma.setId(form.getId());
                tms = new TomaMuestraSuelo();
                tmp = nodo.getChildText("nroMuestra");
                tms.setNroMuestra(Integer.parseInt(nodo.getChildText("nroMuestra")));
                tmp = nodo.getChildText("horaMuestreo");
                tms.setHoraMuestreo(tmp.substring(8));
                tmp = nodo.getChildText("calicata");
                tms.setCalicata(nodo.getChildText("calicata"));
                tmp = nodo.getChildText("tipoMaterial");
                tms.setTipoMaterial(nodo.getChildText("tipoMaterial"));
                tmp = nodo.getChildText("procedencia");
                tms.setProcedencia(nodo.getChildText("procedencia"));
                tmp = nodo.getChildText("descripcionVisual");
                tms.setDescripcionVisual("descripcionVisual");
                tmp = nodo.getChildText("ubicacion");
                tms.setUbicacion(nodo.getChildText("ubicacion"));
                tmp = nodo.getChildText("firmado");
                if (tmp.equals("True")) {
                    tms.setFirmado(Boolean.TRUE);
                } else {
                    tms.setFirmado(Boolean.FALSE);
                }
                persist(form);
                tms.setId(form.getId());
                persist(tms);

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado, ubicacion) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera', '"+ tms.getUbicacion() +"')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera', ubicacion = '"+ tms.getUbicacion() +"' where id_ensayo = '"+ ensayo_id +"'");
                }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");
            }
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";
    }

    private String codigoEnsayo(String codigo) {
        try {
            Connection con = null;
            String codigoRD = null;
            Statement s = null;
            ResultSet rs = null;
            con = conectarBD();
            if (codigo.equals("073")) {
                codigoRD = "A1";
            }
            if (codigo.equals("031")) {
                codigoRD = "A2";
            }
            if (codigo.equals("043")) {
                codigoRD = "A7";
            }
            if (codigo.equals("057")) {
                codigoRD = "A6";
            }
            if (codigo.equals("065")) {
                codigoRD = "A5";
            }
            if (codigo.equals("087")) {
                codigoRD = "A9";
            }
            if (codigo.equals("019")) {
                codigoRD = "S12";
            }
            if (codigo.equals("092")) {
                codigoRD = "S11";
            }
            if (codigo.equals("010")) {
                codigoRD = "H1";
            }
            if (codigo.equals("00S")) {
                codigoRD = "S1";
            }
            s = con.createStatement();
            s.executeQuery("select id_catalogo_ensayo from catalogo_ensayo where codigo = '" + codigoRD + "'");
            rs = s.getResultSet();
            if (rs.next()) {
                int id = rs.getInt(1);
                return String.valueOf(id);
            }

        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendControlTasaRiego")
    public String sendControlTasaRiego(@WebParam(name = "formularios") String formularios) {
        Formulario form;
        ControlTasaRiego ctr;
        MedicionesCTR medCtr;
        OrdenDeTrabajo ot;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        List<OrdenDeTrabajo> ordenesLT;
        java.util.Date date;
        Connection con = null, con2 = null;
        Element nodo, medicion;
        Statement s;
        ResultSet rs;
        DateTime jodaDT;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            List med;
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("dd-MM-yy HH:mm:ss");

            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa, estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }
            String tmp;
            for (int i = 0; i < lista.size(); i++) {
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                ctr = new ControlTasaRiego();
                tmp = nodo.getChildText("tipoRiego");
                ctr.setTipoRiego(tmp);
                tmp = nodo.getChildText("ubicacion");
                ctr.setUbicacion(tmp);
                tmp = nodo.getChildText("tipoAsfalto");
                ctr.setTipoAsfalto(tmp);
                tmp = nodo.getChildText("observaciones");
                ctr.setObservaciones(tmp);
                tmp = nodo.getChildText("revisadoPor");
                ctr.setRevisadoPor(tmp);
                tmp = nodo.getChildText("fechaRevision");
                date = df.parse(tmp);
                ctr.setFechaRevision(date);

                persist(form);
                ctr.setId(form.getId());
                persist(ctr);

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado, ubicacion) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera','"+ ctr.getUbicacion() +"')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera', ubicacion = '"+ ctr.getUbicacion() +"' where id_ensayo = '"+ ensayo_id +"'");
                }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");

                int numero = 1;
                nodo = nodo.getChild("mediciones");
                if(nodo != null){
                    med = nodo.getChildren("medicion");

                    MedicionesCTRPK medCTRPK = new MedicionesCTRPK();
                    medCTRPK.setId(ctr.getId());
                    for (int z = 0; z < med.size(); z++) {
                        medicion = (Element) med.get(z);
                        medCtr = new MedicionesCTR();
                        tmp = medicion.getChildText("asfalto");
                        medCtr.setAsfalto(new BigDecimal(tmp));
                        tmp = medicion.getChildText("dosis");
                        medCtr.setDosis(new BigDecimal(tmp));
                        tmp = medicion.getChildText("tempAmbiente");
                        medCtr.setTempAmbiente(new BigDecimal(tmp));
                        tmp = medicion.getChildText("tempLigante");
                        medCtr.setTempLigante(new BigDecimal(tmp));
                        tmp = medicion.getChildText("observaciones");
                        medCtr.setObservaciones(tmp);
                        tmp = medicion.getChildText("area");
                        medCtr.setArea(new BigDecimal(tmp));
                        tmp = medicion.getChildText("ancho");
                        medCtr.setAncho(new BigDecimal(tmp));
                        tmp = medicion.getChildText("largo");
                        medCtr.setLargo(new BigDecimal(tmp));
                        tmp = medicion.getChildText("KM");
                        medCtr.setKm(Integer.parseInt(tmp));
                        medCTRPK.setControlNumero(numero);
                        medCtr.setMedicionesCTRPK(medCTRPK);
                        persist(medCtr);
                        numero++;
                    }
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (ParseException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendControlTemp")
    public String sendControlTemp(@WebParam(name = "formularios") String formularios) {
        String hora = null;
        Formulario form;
        ControlTemperatura ct;
        MedicionesCT medCt;
        OrdenDeTrabajo ot;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        List<OrdenDeTrabajo> ordenesLT;
        java.util.Date date;
        DateTime jodaDT;
        Connection con = null, con2 = null;
        Element nodo, medicion;
        Statement s;
        ResultSet rs;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            List med;
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("dd-MM-yy HH:mm:ss");

            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa, estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }
            String tmp;
            for (int i = 0; i < lista.size(); i++) {
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                ct = new ControlTemperatura();
                tmp = nodo.getChildText("revisadoPor");
                ct.setRevisadoPor(tmp);
                tmp = nodo.getChildText("ubicacion");
                ct.setUbicacion(tmp);
                tmp = nodo.getChildText("fechaRevision");
                date = df.parse(tmp);
                ct.setFechaRevision(date);
                tmp = nodo.getChildText("observaciones");
                ct.setObservaciones(tmp);

                persist(form);
                ct.setId(form.getId());
                persist(ct);

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado, ubicacion) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera','"+ ct.getUbicacion() +"')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera', ubicacion = '"+ ct.getUbicacion() +"' where id_ensayo = '"+ ensayo_id +"'");
                }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");

                int numero = 1;

                nodo = nodo.getChild("mediciones");
                if(nodo != null){
                    med = nodo.getChildren("medicion");
                    MedicionesCTPK medCTPK = new MedicionesCTPK();
                    medCTPK.setId(ct.getId());

                    for (int z = 0; z < med.size(); z++) {
                        medicion = (Element) med.get(z);
                        medCt = new MedicionesCT();
                        medCt.setMedicionesCTPK(new MedicionesCTPK(0, ct.getId()));
                        tmp = medicion.getChildText("tempLlegada");
                        medCt.setTempLlegada(new BigDecimal(tmp));
                        tmp = medicion.getChildText("tempCompactacion");
                        medCt.setTempCompactacion(new BigDecimal(tmp));
                        tmp = medicion.getChildText("tempSalida");
                        medCt.setTempSalida(new BigDecimal(tmp));
                        tmp = medicion.getChildText("tempAmbiente");
                        medCt.setTempAmbiente(new BigDecimal(tmp));
                        tmp = medicion.getChildText("frente");
                        medCt.setFrente(tmp);
                        tmp = medicion.getChildText("nroGuia");
                        medCt.setNroGuia(Integer.parseInt(tmp));
                        tmp = medicion.getChildText("patenteCamion");
                        medCt.setPatenteCamion(tmp);
                        tmp = medicion.getChildText("horaLlegada");
                        hora = tmp.substring(8);
                        medCt.setHoraLlegada(hora);
                        tmp = medicion.getChildText("horaSalida");
                        hora = tmp.substring(8);
                        medCt.setHoraSalida(hora);
                        tmp = medicion.getChildText("mcubicos");
                        medCt.setMcubicos(Integer.parseInt(tmp));
                        medCTPK.setControlNumero(numero);
                        medCt.setMedicionesCTPK(medCTPK);
                        persist(medCt);
                        numero++;
                    }
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (ParseException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendDensidadesCarpetaAsf")
    public String sendDensidadesCarpetaAsf(@WebParam(name = "formularios") String formularios) {
        Formulario form = new Formulario();
        DensidadesCarpetaAsfaltica dcasf = new DensidadesCarpetaAsfaltica();
        MedicionesDCAs medDcas;
        OrdenDeTrabajo ot;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        List<OrdenDeTrabajo> ordenesLT;
        java.util.Date date;
        Connection con = null, con2 = null;
        Element nodo, medicion;
        Statement s;
        ResultSet rs;
        DateTime jodaDT;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            List med;
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("dd-MM-yy HH:mm:ss");

            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa,estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }
            String tmp;
            for (int i = 0; i < lista.size(); i++) {
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close(); 
                }

                dcasf = new DensidadesCarpetaAsfaltica();
                tmp = nodo.getChildText("revisadoPor");
                dcasf.setRevisadoPor(tmp);
                tmp = nodo.getChildText("fechaRevision");
                date = df.parse(tmp);
                dcasf.setFechaRevision(date);
                tmp = nodo.getChildText("observaciones");
                dcasf.setObservaciones(tmp);
                tmp = nodo.getChildText("codDensimetroNuclear");

                persist(form);
                dcasf.setId(form.getId());
                dcasf.setCodDensimetroNuclear(tmp);
                persist(dcasf);

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera' where id_ensayo = '"+ ensayo_id +"'");
                }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");

                int numero = 1;

                nodo = nodo.getChild("mediciones");
                if(nodo != null){
                    med = nodo.getChildren("medicion");
                    MedicionesDCAsPK medDCAsPK = new MedicionesDCAsPK();
                    medDCAsPK.setId(dcasf.getId());
                    for (int z = 0; z < med.size(); z++) {
                        medicion = (Element) med.get(z);
                        medDcas = new MedicionesDCAs();
                        tmp = medicion.getChildText("ubicaicon");
                        medDcas.setUbicacion(tmp);
                        tmp = medicion.getChildText("densidad");
                        medDcas.setDensidad(Integer.parseInt(tmp));
                        tmp = medicion.getChildText("densidadMarshall");
                        medDcas.setDensidadMarshall(Integer.parseInt(tmp));
                        tmp = medicion.getChildText("informeReferencia");
                        medDcas.setInformeReferencia(tmp);
                        tmp = medicion.getChildText("compactacion");
                        medDcas.setCompactacion(Integer.parseInt(tmp));
                        medDCAsPK.setNumero(numero);
                        medDcas.setMedicionesDCAsPK(medDCAsPK);
                        persist(medDcas);
                        numero++;
                    }
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (ParseException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendDensidadesConoArena")
    public String sendDensidadesConoArena(@WebParam(name = "formularios") String formularios) {
        Formulario form;
        DensidadesConoArena dcar;
        PuntoDCAr puntoDcar;
        InformeReferenciaDCAr infRefDcar;
        OrdenDeTrabajo ot;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        List<OrdenDeTrabajo> ordenesLT;
        java.util.Date date;
        Connection con = null, con2 = null;
        Element nodo, punto, informe;
        Statement s;
        ResultSet rs;
        DateTime jodaDT;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            List puntoList, infoList;
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("dd-MM-yy HH:mm:ss");

            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa,estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }
            String tmp;
            for (int i = 0; i < lista.size(); i++) {
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }

                dcar = new DensidadesConoArena();
                tmp = nodo.getChildText("revisadoPor");
                dcar.setRevisadoPor(tmp);
                tmp = nodo.getChildText("fechaRevision");
                date = df.parse(tmp);
                dcar.setFechaRevision(date);
                tmp = nodo.getChildText("observaciones");
                dcar.setObservaciones(tmp);

                persist(form);
                dcar.setId(form.getId());
                persist(dcar);

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera' where id_ensayo = '"+ ensayo_id +"'");
                }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");


                Element puntosEL;
                int numero = 1;
                puntosEL = nodo.getChild("puntos");
                if(puntosEL != null){
                    puntoList = puntosEL.getChildren("punto");
                    PuntoDCArPK puntoDcarPK = new PuntoDCArPK();
                    puntoDcarPK.setId(dcar.getId());
                    // Se revisan los puntos ingresados para obtener el numero mayor ingresado
                    List<PuntoDCAr> puntoLS;
                    // Se ingresan los puntos en nuestra BD y en la remota
                    int pesoarenaEst = 2910, conocalib = 2913, densarena = 2916, pesoarena = 2919, pesosuelo = 2922, pesorecip = 2925, pesohum1 = 2928, pesohum2 = 2929, pesoseco1 = 2934, pesoseco2 = 2935, pesorecip1 = 2952, pesorecip2 = 2953;
                    for (int z = 0; z < puntoList.size(); z++) {
                        punto = (Element) puntoList.get(z);
                        puntoDcar = new PuntoDCAr();
                        tmp = punto.getChildText("pesoRecip");
                        puntoDcar.setPesoRecip(new BigDecimal(tmp));
                        tmp = punto.getChildText("pesoArena");
                        puntoDcar.setPesoArena(new BigDecimal(tmp));
                        tmp = punto.getChildText("humedadPromedio");
                        puntoDcar.setHumedadPromedio(new BigDecimal(tmp));
                        tmp = punto.getChildText("calibConoPlacaBase");
                        puntoDcar.setCalibConoPlacaBase(new BigDecimal(tmp));
                        tmp = punto.getChildText("densidadSeca");
                        puntoDcar.setDensidadSeca(new BigDecimal(tmp));
                        tmp = punto.getChildText("pesoSueloRecip");
                        puntoDcar.setPesoSueloRecip(new BigDecimal(tmp));
                        tmp = punto.getChildText("codigoCono");
                        puntoDcar.setCodigoCono(tmp);
                        tmp = punto.getChildText("codigoBalanza");
                        puntoDcar.setCodigoBalanza(tmp);
                        tmp = punto.getChildText("pesoArenaRem");
                        puntoDcar.setPesoArena(new BigDecimal(tmp));
                        tmp = punto.getChildText("densidadHumeda");
                        puntoDcar.setDensidadHumeda(new BigDecimal(tmp));
                        tmp = punto.getChildText("DASEstandar");
                        puntoDcar.setDASEstandar(new BigDecimal(tmp));
                        tmp = punto.getChildText("pesoHumedoRecip1");
                        puntoDcar.setPesoHumedoRecip1(new BigDecimal(tmp));
                        tmp = punto.getChildText("pesoHumedoRecip2");
                        puntoDcar.setPesoHumedoRecip2(new BigDecimal(tmp));
                        tmp = punto.getChildText("pesoSecoRecip1");
                        puntoDcar.setPesoSecoRecip1(new BigDecimal(tmp));
                        tmp = punto.getChildText("pesoSecoRecip2");
                        puntoDcar.setPesoSecoRecip2(new BigDecimal(tmp));
                        tmp = punto.getChildText("pesoRecip1");
                        puntoDcar.setPesoRecip1(new BigDecimal(tmp));
                        tmp = punto.getChildText("pesoRecip2");
                        puntoDcar.setPesoRecip2(new BigDecimal(tmp));
                        tmp = punto.getChildText("pcientoHumedad1");
                        puntoDcar.setPcientoHumedad1(new BigDecimal(tmp));
                        tmp = punto.getChildText("pcientoHumedad2");
                        puntoDcar.setPcientoHumedad2(new BigDecimal(tmp));
                        puntoDcarPK.setNroPunto(numero);
                        puntoDcar.setPuntoDCArPK(puntoDcarPK);
                        persist(puntoDcar);
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesoarenaEst +"','"+ ensayo_id +"','"+ puntoDcar.getPesoArena() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ conocalib +"','"+ ensayo_id +"','"+ puntoDcar.getCodigoCono() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ densarena +"','"+ ensayo_id +"','"+ puntoDcar.getDASEstandar() +"','"+ z +"')");
                        //s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesoarena +"','"+ ensayo_id +"','"+ puntoDcar.getPesoArenaRem() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesosuelo +"','"+ ensayo_id +"','"+ puntoDcar.getPesoSueloRecip() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesorecip +"','"+ ensayo_id +"','"+ puntoDcar.getPesoRecip() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesohum1 +"','"+ ensayo_id +"','"+ puntoDcar.getPesoHumedoRecip1() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesohum2 +"','"+ ensayo_id +"','"+ puntoDcar.getPesoHumedoRecip2() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesoseco1 +"','"+ ensayo_id +"','"+ puntoDcar.getPesoSecoRecip1() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesoseco2 +"','"+ ensayo_id +"','"+ puntoDcar.getPesoSecoRecip2() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesorecip1 +"','"+ ensayo_id +"','"+ puntoDcar.getPesoRecip1() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ pesorecip2 +"','"+ ensayo_id +"','"+ puntoDcar.getPesoRecip2() +"','"+ z +"')");
                        numero++;
                        pesoarenaEst++;
                        conocalib++;
                        densarena++;
                        pesoarena++;
                        pesosuelo++;
                        pesorecip++;
                        pesohum1 = pesohum1 + 2;
                        pesohum2 = pesohum2 + 2;
                        pesoseco1 = pesoseco1 + 2;
                        pesoseco2 = pesoseco2 + 2;
                        pesorecip1 = pesorecip1 + 2;
                        pesorecip2 = pesorecip2 + 2;
                    }
                }

                //Se ingresan los informes en nuestra BD y la remota
                nodo = nodo.getChild("informes");
                if(nodo != null){
                    infoList = nodo.getChildren("informe");


                    InformeReferenciaDCArPK infRefDCArPK = new InformeReferenciaDCArPK();
                    infRefDCArPK.setId(dcar.getId());

                    numero = 1;
                    int procref = 2958, drref = 2961;
                    for(int z=0;z<infoList.size();z++){
                        informe = (Element)infoList.get(z);
                        infRefDcar = new InformeReferenciaDCAr();
                        tmp = informe.getChildText("DRRef");
                        infRefDcar.setDRRef(new BigDecimal(tmp));
                        tmp = informe.getChildText("nroSueloInf");
                        infRefDcar.setNroSueloInf(Integer.parseInt(tmp));
                        tmp = informe.getChildText("densidadRelativa");
                        infRefDcar.setDensidadRelativa(new BigDecimal(tmp));
                        tmp = informe.getChildText("PMoPS");
                        infRefDcar.setPMoPS(new BigDecimal(tmp));
                        tmp = informe.getChildText("proctorRef");
                        infRefDcar.setProctorRef(new BigDecimal(tmp));
                        infRefDCArPK.setNroInfReferencia(numero);
                        infRefDcar.setInformeReferenciaDCArPK(infRefDCArPK);
                        persist(infRefDcar);
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ procref +"','"+ ensayo_id +"','"+ infRefDcar.getProctorRef() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ drref +"','"+ ensayo_id +"','"+ infRefDcar.getDRRef() +"','"+ z +"')");
                        numero++;
                        procref++;
                        drref++;
                    }
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (ParseException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendHilo")
    public String sendHilo(@WebParam(name = "formularios") String formularios) {
        Formulario form;
        Hilo hilo;
        MedicionesHilo medHilo;
        OrdenDeTrabajo ot;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        List<OrdenDeTrabajo> ordenesLT;
        java.util.Date date;
        Connection con = null, con2 = null;
        Element nodo, medicion;
        Statement s;
        ResultSet rs;
        DateTime jodaDT;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            List med;
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("HH:mm:ss");

            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa,estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }
            String tmp;
            for (int i = 0; i < lista.size(); i++) {
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                hilo = new Hilo();
                tmp = nodo.getChildText("codigoEquipo");
                hilo.setCodigoEquipo(tmp);
                tmp = nodo.getChildText("tramoTotal");
                hilo.setTramoTotal(tmp);
                tmp = nodo.getChildText("calle");
                hilo.setCalle(tmp);
                tmp = nodo.getChildText("faja");
                hilo.setFaja(tmp);
                tmp = nodo.getChildText("capaControlada");
                hilo.setCapaControlada(tmp);
                tmp = nodo.getChildText("anchoFaja");
                hilo.setAnchoFaja(Integer.parseInt(tmp));

                persist(form);
                hilo.setId(form.getId());
                persist(hilo);

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera' where id_ensayo = '"+ ensayo_id +"'");
                }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");


                int numero = 1;
                nodo = nodo.getChild("mediciones");
                if(nodo != null){
                    med = nodo.getChildren("medicion");
                    MedicionesHiloPK medHiloPK = new MedicionesHiloPK();
                    medHiloPK.setId(hilo.getId());
                    for (int z = 0; z < med.size(); z++) {
                        medicion = (Element) med.get(z);
                        medHilo = new MedicionesHilo();
                        tmp = medicion.getChildText("kmInicio");
                        medHilo.setKmInicio(Integer.parseInt(tmp));
                        tmp = medicion.getChildText("kmFinal");
                        medHilo.setKmFinal(Integer.parseInt(tmp));
                        tmp = medicion.getChildText("altos");
                        medHilo.setAltos(Integer.parseInt(tmp));
                        tmp = medicion.getChildText("bajos");
                        medHilo.setBajos(Integer.parseInt(tmp));
                        tmp = medicion.getChildText("areaAfectada");
                        medHilo.setAreaAfectada(Integer.parseInt(tmp));
                        tmp = medicion.getChildText("observaciones");
                        medHilo.setObservaciones(tmp);
                        tmp = medicion.getChildText("longitud");
                        medHilo.setLongitud(Integer.parseInt(tmp));
                        tmp = medicion.getChildText("longExt");
                        medHilo.setLongExt(Integer.parseInt(tmp));
                        medHiloPK.setNumero(numero);
                        medHilo.setMedicionesHiloPK(medHiloPK);
                        persist(medHilo);
                        numero++;
                    }
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendTomaMuestraHormigon")
    public String tomaMuestraHormigon(@WebParam(name = "formularios") String formularios) {
        Formulario form;
        TomaMuestraHormigon tmh;
        AntecedentesHormigon ante;
        MaterialesHormigon mat;
        MaterialesHormigonPK matPK;
        RupturaMoldes rup;
        RupturaMoldesPK rupPK;
        NroMoldes nmold;
        NroMoldesPK nmoldPK;
        OrdenDeTrabajo ot;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        List<OrdenDeTrabajo> ordenesLT;
        java.util.Date date;
        Connection con = null;
        Element nodo, material,ruptura,nroMolde;
        Statement s;
        ResultSet rs;
        DateTime jodaDT;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            List nroMoldesList, rupturaMoldesList, materialesList;
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("dd-MM-yy HH:mm:ss");

            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa.estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }
            String tmp;
            for (int i = 0; i < lista.size(); i++) {
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }

                tmh = new TomaMuestraHormigon();
                tmp = nodo.getChildText("empresaSuministradora");
                tmh.setEmpresaSuministradora(tmp);
                tmp = nodo.getChildText("informante");
                tmh.setInformante(tmp);
                tmp = nodo.getChildText("planta");
                tmh.setPlanta(tmp);
                tmp = nodo.getChildText("contenidoAire");
                tmh.setContenidoAire(Integer.parseInt(tmp));
                tmp = nodo.getChildText("ciudadKM");
                tmh.setCiudadKM(tmp);
                tmp = nodo.getChildText("densidadFresca");
                tmh.setDensidadFresca(new BigDecimal(tmp));
                tmp = nodo.getChildText("profesional");
                tmh.setProfesional(tmp);
                tmp = nodo.getChildText("solicitadoPor");
                tmh.setSolicitadoPor(tmp);
                tmp = nodo.getChildText("observaciones");
                tmh.setObservaciones(tmp);
                tmp = nodo.getChildText("metCompactProbeta");
                tmh.setMetCompactProbeta(tmp);
                tmp = nodo.getChildText("curadoObra");
                tmh.setCuradoObra(tmp);
                tmp = nodo.getChildText("curadoLaboratorio");
                tmh.setCuradoLaboratorio(tmp);
                tmp = nodo.getChildText("fechaCurado");
                date = df.parse(tmp);
                tmh.setFechaCurado(date);
                tmp = nodo.getChildText("muestreadoPor");
                tmh.setMuestreadoPor(tmp);
                tmp = nodo.getChildText("lugarExtraccion");
                tmh.setLugarExtraccion(tmp);
                tmp = nodo.getChildText("asentamiento");
                tmh.setAsentamiento(new BigDecimal(tmp));
                tmp = nodo.getChildText("tempAmbiente");
                tmh.setTempAmbiente(new BigDecimal(tmp));
                tmp = nodo.getChildText("tempHormigon");
                tmh.setTempHormigon(new BigDecimal(tmp));
                tmp = nodo.getChildText("elegidoPor");
                tmh.setElegidoPor(tmp);
                tmp = nodo.getChildText("tipoMuestraInsitu");
                tmh.setTipoMuestraInsitu(tmp);
                tmp = nodo.getChildText("tipoMuestraSimple");
                tmh.setTipoMuestraSimple(tmp);
                tmp = nodo.getChildText("nombreMolde");
                tmh.setNombreMolde(tmp);
                tmp = nodo.getChildText("cantidadMolde");
                tmh.setCantidadMolde(Integer.parseInt(tmp));
                tmp = nodo.getChildText("horaLlegadaObra");
                tmh.setHoraLlegadaObra(tmp.substring(8));
                tmp = nodo.getChildText("horaSalidaObra");
                tmh.setHoraSalidaObra(tmp.substring(8));
                tmp = nodo.getChildText("horaLlegadaMuestreo");
                tmh.setHoraLlegadaMuestreo(tmp.substring(8));
                tmp = nodo.getChildText("horaCargaMuestreo");
                tmh.setHoraCargaMuestreo(tmp.substring(8));
                tmp = nodo.getChildText("inicioDescargaMuestreo");
                tmh.setInicioDescargaMuestreo(tmp.substring(8));
                tmp = nodo.getChildText("horaTerminoMuestreo");
                tmh.setHoraTerminoMuestreo(tmp.substring(8));
                tmp = nodo.getChildText("horaMuestreo");
                tmh.setHoraMuestreo(tmp.substring(8));
                tmp = nodo.getChildText("ensayo");
                tmh.setEnsayo(tmp);

                persist(form);
                tmh.setId(form.getId());
                persist(tmh);

                ante = new AntecedentesHormigon();
                tmp = nodo.getChildText("codigo");
                ante.setCodigo(Integer.parseInt(tmp));
                tmp = nodo.getChildText("datosGuia");
                ante.setDatosGuia(Integer.parseInt(tmp));
                tmp = nodo.getChildText("mixer");
                ante.setMixer(Integer.parseInt(tmp));
                tmp = nodo.getChildText("patente");
                ante.setPatente(tmp);
                tmp = nodo.getChildText("tipoElemento");
                ante.setTipoElemento(tmp);
                tmp = nodo.getChildText("compactObra");
                ante.setCompactObra(tmp);
                tmp = nodo.getChildText("mezclado");
                ante.setMezclado(tmp);
                tmp = nodo.getChildText("aspectoH");
                ante.setAspectoH(tmp);
                tmp = nodo.getChildText("texturaH");
                ante.setTexturaH(tmp);
                tmp = nodo.getChildText("transporte");
                ante.setTransporte(tmp);
                tmp = nodo.getChildText("colocacion");
                ante.setColocacion(tmp);
                tmp = nodo.getChildText("volumenHormigon");
                ante.setVolumenHormigon(Integer.parseInt(tmp));
                tmp = nodo.getChildText("ubicacion");
                ante.setUbicacion(tmp);
                tmp = nodo.getChildText("hormigonTipo");
                ante.setHormigonTipo(tmp);

                ante.setId(form.getId());
                persist(ante);

                material = nodo.getChild("materiales");
                materialesList = material.getChildren("material");
                matPK = new MaterialesHormigonPK();
                matPK.setId(ante.getId());

                for(int z=0;z<materialesList.size();z++){
                    material = (Element)materialesList.get(z);
                    mat = new MaterialesHormigon();
                    tmp = material.getChildText("nombre");
                    matPK.setMaterial(tmp);
                    tmp = material.getChildText("dosificacion");
                    mat.setDosificacion(Integer.parseInt(tmp));
                    tmp = material.getChildText("procedencia");
                    mat.setProcedencia(tmp);
                    mat.setMaterialesHormigonPK(matPK);
                    persist(mat);
                }

                ruptura = nodo.getChild("rupturas");
                rupturaMoldesList = ruptura.getChildren("ruptura");
                rupPK = new RupturaMoldesPK();
                rupPK.setId(tmh.getId());
                
                for(int z=0;z<rupturaMoldesList.size();z++){
                    ruptura = (Element)rupturaMoldesList.get(z);
                    rup = new RupturaMoldes();
                    tmp = ruptura.getChildText("cubo");
                    rupPK.setCubo(Integer.parseInt(tmp));
                    tmp = ruptura.getChildText("dias");
                    rupPK.setDias(Integer.parseInt(tmp));
                    rup.setRupturaMoldesPK(rupPK);
                    persist(rup);
                }

                nroMolde = nodo.getChild("moldes");
                nroMoldesList = nroMolde.getChildren("nroMolde");
                nmoldPK = new NroMoldesPK();
                nmoldPK.setId(tmh.getId());

                for(int z=0;z<nroMoldesList.size();z++){
                    nroMolde = (Element)nroMoldesList.get(z);
                    nmold = new NroMoldes();
                    tmp = nroMolde.getText();
                    nmoldPK.setNroMolde(Integer.parseInt(tmp));
                    nmold.setNroMoldesPK(nmoldPK);
                    persist(nmold);
                }

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado, ubicacion) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera','"+ ante.getUbicacion() +"')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera', ubicacion = '"+ ante.getUbicacion() +"' where id_ensayo = '"+ ensayo_id+ "'");
                }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");            }

        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (ParseException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";

    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendMarshallControl")
    public String sendMarshallControl(@WebParam(name = "formularios") String formularios) {
        Formulario form;
        MarshallControl marshall;
        OrdenDeTrabajo ot;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        List<OrdenDeTrabajo> ordenesLT;
        java.util.Date date;
        Connection con = null;
        Element nodo, medicion;
        Statement s;
        ResultSet rs;
        DateTime jodaDT;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            List med;
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("dd-MM-yy HH:mm:ss");

            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa,estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }
            String tmp;
            for (int i = 0; i < lista.size(); i++) {
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }

                marshall = new MarshallControl();
                tmp = nodo.getChildText("fechaConfeccion");
                date = df.parse(tmp);
                marshall.setFechaConfeccion(date);
                tmp = nodo.getChildText("cordon");
                marshall.setCordon(Boolean.parseBoolean(tmp));
                tmp = nodo.getChildText("capa");
                marshall.setCapa(Boolean.parseBoolean(tmp));
                tmp = nodo.getChildText("camionesTransp");
                marshall.setCamionesTransp(Boolean.parseBoolean(tmp));
                tmp = nodo.getChildText("confeccionEnSitio");
                marshall.setConfeccionEnSitio(Boolean.parseBoolean(tmp));
                tmp = nodo.getChildText("fabrPlanta");
                marshall.setFabrPlanta(Boolean.parseBoolean(tmp));
                tmp = nodo.getChildText("empresaSuministradora");
                marshall.setEmpresaSuministradora(tmp);
                tmp = nodo.getChildText("cantidad");
                marshall.setCantidad(new BigDecimal(tmp));
                tmp = nodo.getChildText("tipoLigante");
                marshall.setTipoLigante(tmp);
                tmp = nodo.getChildText("tipoMezcla");
                marshall.setTipoMezcla(tmp);
                tmp = nodo.getChildText("ubicacionMezcla");
                marshall.setUbicacionMezcla(tmp);
                tmp = nodo.getChildText("tempMezcladoDiseno");
                marshall.setTempMezcladoDiseno(new BigDecimal(tmp));
                tmp = nodo.getChildText("tempCompactDiseno");
                marshall.setTempCompactDiseno(new BigDecimal(tmp));
                tmp = nodo.getChildText("tempSalidaPlantaCamion");
                marshall.setTempSalidaPlantaCamion(new BigDecimal(tmp));
                tmp = nodo.getChildText("tempLlegadaObraCamion");
                marshall.setTempLlegadaObraCamion(new BigDecimal(tmp));
                tmp = nodo.getChildText("tempCompactProb");
                marshall.setTempCompactProb(new BigDecimal(tmp));
                tmp = nodo.getChildText("tempCompactCarpeta");
                marshall.setTempCompactCarpeta(new BigDecimal(tmp));
                tmp = nodo.getChildText("tempAmbiente");
                marshall.setTempAmbiente(new BigDecimal(tmp));
                tmp = nodo.getChildText("horaTerminoDescarga");
                marshall.setHoraTerminoDescarga(tmp.substring(8));
                tmp = nodo.getChildText("horaSalidaCamion");
                marshall.setHoraSalidaCamion(tmp.substring(8));
                tmp = nodo.getChildText("horaLlegadaCamion");
                marshall.setHoraLlegadaCamion(tmp.substring(8));
                tmp = nodo.getChildText("codigoTermometro");
                marshall.setCodigoTermometro(tmp);
                tmp = nodo.getChildText("tipoTransito");
                marshall.setTipoTransito(tmp);
                tmp = nodo.getChildText("guia");
                marshall.setGuia(Integer.parseInt(tmp));
                tmp = nodo.getChildText("patenteCamion");
                marshall.setPatenteCamion(tmp);
                persist(form);
                marshall.setId(form.getId());
                persist(marshall);

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera' where id_ensayo = '"+ ensayo_id +"'");
               }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");
            }

        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (ParseException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "sendDensidadesConDensimetro")
    public String sendDensidadesConDensimetro(@WebParam(name = "formularios") String formularios) {
        Formulario form;
        DensidadesConDensimetro dcd;
        PuntoDCD puntoDcd;
        InformeReferenciaDCD informeDcd;
        OrdenDeTrabajo ot;
        ArrayList<OrdenDeTrabajo> ordenes = new ArrayList<OrdenDeTrabajo>();
        List<OrdenDeTrabajo> ordenesLT;
        java.util.Date date;
        Connection con = null, con2 = null;
        Element nodo, punto, informe;
        Statement s;
        ResultSet rs;
        DateTime jodaDT;
        try {
            SAXBuilder builder = new SAXBuilder();
            Reader in = new StringReader(formularios);
            Document doc = null;
            doc = builder.build(in);
            Element rootnode = doc.getRootElement();
            List lista = rootnode.getChildren("formulario");
            List ots = rootnode.getChildren("orden");
            List puntoList, informeList;
            DateFormat df = new SimpleDateFormat("dd-MM-yy");
            DateFormat tf = new SimpleDateFormat("dd-MM-yy HH:mm:ss");
            // Esto recorre los ots recibidos por xml y los guarda en las bases de datos si no existen
            for (int j = 0; j < ots.size(); j++) {
                nodo = (Element) ots.get(j);
                ot = getOt(nodo);
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", ot.getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() == 0) {
                        persist(ot);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                // esto hace la misma verificacion que arriba pero en la BD remota
                con = conectarBD();
                s = con.createStatement();
                s.executeQuery("select * from orden_trabajo where orden_trabajo = '" + ot.getNroOT() + "'");
                rs = s.getResultSet();
                if (!rs.next()){
                    jodaDT = new DateTime(ot.getFecha());
                    String insert = "insert into orden_trabajo (orden_trabajo, fecha, obra, empresa, estado) values('" + ot.getNroOT() + "','" + jodaDT.toString("yyyy-MM-dd") + "','" + ot.getObra() + "','" + ot.getEmpresa() + "','En espera')";
                    s.execute(insert);
                }
                ordenes.add(ot);
            }
            String tmp;
            //Esto recorre los formularios que llegan por xml
            for (int i = 0; i < lista.size(); i++) {
                int obra = -1;
                nodo = (Element) lista.get(i);
                form = getForm(nodo);
                // se obtiene la orden de trabajo asociada para poder guardar el ensayo que requiere id obra
                EntityManager em = emf.createEntityManager();
                try {
                    utx.begin();
                    Query q = em.createQuery("select object(o) from OrdenDeTrabajo as o where o.nroOT = :nroOT");
                    q.setParameter("nroOT", form.getNroOT().getNroOT());
                    utx.commit();
                    ordenesLT = q.getResultList();
                    if (ordenesLT.size() > 0) {
                        obra = ordenesLT.get(0).getObra();
                    }
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
                    throw new RuntimeException(ex);
                } finally {
                    em.close();
                }
                //Se ingresan los datos que llegan por xml en el objeto dcd
                dcd = new DensidadesConDensimetro();
                tmp = nodo.getChildText("codigoDensimetro");
                dcd.setCodigoDensimetro(tmp);
                tmp = nodo.getChildText("conteos");
                dcd.setConteos(Integer.parseInt(tmp));
                tmp = nodo.getChildText("fechaRevision");
                date = df.parse(tmp);
                dcd.setFechaRevision(date);
                tmp = nodo.getChildText("observaciones");
                dcd.setObservaciones(tmp);
                tmp = nodo.getChildText("revisadoPor");
                dcd.setRevisadoPor(tmp);
                //se guarda el formulario en nuestra BD
                persist(form);
                dcd.setId(form.getId());
                //se guarda el formulario en la tabla especifica en nuestra BD
                persist(dcd);

                //se ingresa el formulario en la tabla ensayo de la BD remota
                int ensayo_id = 0;
                con = conectarBD();
                s = con.createStatement();
                jodaDT = new DateTime(form.getFecha());
                if(form.getId_externo() == -1){
                    s.execute("insert into ensayo (fecha, orden_de_trabajo, id_catalogo_ensayo, obra, estado) values('" + jodaDT.toString("yyyy-MM-dd") + "','" + form.getNroOT() + "','" + codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) + "','"+ obra +"','En espera')");
                    s.executeQuery("select last_insert_id()");
                    rs = s.getResultSet();
                    if(rs.next())
                        ensayo_id = rs.getInt(1);
                }else{
                    ensayo_id = form.getId_externo();
                    s.executeUpdate("update ensayo set fecha = '"+ jodaDT.toString("yyyy-MM-dd") +"', orden_de_trabajo = '"+ form.getNroOT() +"', id_catalogo_ensayo = '"+ codigoEnsayo(form.getCodigoEnsayo().getCodigoEnsayo()) +"', obra = '"+ obra +"', estado = 'En espera' where id_ensayo = '"+ ensayo_id +"'");
                }
                s.execute("delete from entrada where id_ensayo = '"+ ensayo_id  +"'");

                Element puntosEL;
                int numero = 1;
                puntosEL = nodo.getChild("puntos");
                if(puntosEL != null){
                    puntoList = puntosEL.getChildren("punto");
                    PuntoDCDPK puntoDCDPK = new PuntoDCDPK();
                    puntoDCDPK.setId(dcd.getId());
                    // Se revisan los puntos ingresados para obtener el numero mayor ingresado
                    List<PuntoDCD> puntoLS;
                    // Se ingresan los puntos en nuestra BD y en la remota
                    int humprom = 3118, densseca = 3127, dmaxref = 3145, dminref = 3154, protor_referencia = 3827;
                    for (int z = 0; z < puntoList.size(); z++) {
                        punto = (Element) puntoList.get(z);
                        puntoDcd = new PuntoDCD();
                        tmp = punto.getChildText("densidadHumeda");
                        puntoDcd.setDensidadHumeda(new BigDecimal(tmp));
                        tmp = punto.getChildText("humedadPromedio");
                        puntoDcd.setHumedadPromedio(new BigDecimal(tmp));
                        tmp = punto.getChildText("densidadSeca");
                        puntoDcd.setDensidadSeca(new BigDecimal(tmp));
                        puntoDCDPK.setNroPunto(numero);
                        puntoDcd.setPuntoDCDPK(puntoDCDPK);
                        persist(puntoDcd);
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ humprom +"','"+ ensayo_id +"','"+ puntoDcd.getHumedadPromedio() +"','"+ z +"')");
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ densseca +"','"+ ensayo_id +"','"+ puntoDcd.getDensidadSeca() +"','"+ z +"')");
                        //s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ humprom +"','"+ ensayo_id +"','"+ puntoDcd.getHumedadPromedio() +"','"+ z +"')");
                        numero++;
                        humprom++;
                        densseca++;
                    }
                }

                //Se ingresan los informes en nuestra BD y la remota
                nodo = nodo.getChild("informes");
                if(nodo != null){
                    informeList = nodo.getChildren("informe");
                    InformeReferenciaDCDPK infRefDCDPK = new InformeReferenciaDCDPK();
                    infRefDCDPK.setId(dcd.getId());

                    List<InformeReferenciaDCD> informeLS;
                    numero = 1;
                    int procref = 3136;
                    for (int z = 0; z < informeList.size(); z++){
                        informe = (Element) informeList.get(z);
                        informeDcd = new InformeReferenciaDCD();
                        tmp = informe.getChildText("pcientoPMoPS");
                        informeDcd.setPcientoPMoPS(Integer.parseInt(tmp));
                        tmp = informe.getChildText("pcientoDensidadRelativa");
                        informeDcd.setPcientoDensidadRelativa(Integer.parseInt(tmp));
                        tmp = informe.getChildText("nroSueloInf");
                        informeDcd.setNroSueloInf(Integer.parseInt(tmp));
                        tmp = informe.getChildText("DRReferencia");
                        informeDcd.setDRReferencia(new BigDecimal(tmp));
                        tmp = informe.getChildText("proctorReferencia");
                        informeDcd.setProctorReferencia(new BigDecimal(tmp));
                        infRefDCDPK.setNroInformeRef(numero);
                        informeDcd.setInformeReferenciaDCDPK(infRefDCDPK);
                        persist(informeDcd);
                        s.execute("insert into entrada (id_catalogo_entrada, id_ensayo, valor, posicion) values('"+ procref +"','"+ ensayo_id +"','"+ informeDcd.getProctorReferencia() +"','"+ z +"')");
                        numero++;
                        procref++;
                    }
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (ParseException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (JDOMException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        } catch (IOException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
            return "ERROR";
        }
        return "OK";
    }

    private Formulario getForm(Element nodo) {
        Formulario form = new Formulario();
        java.util.Date date;
        DateFormat df = new SimpleDateFormat("dd-MM-yy");
        EntityManager em = emf.createEntityManager();
        List<Ensayo> ensayos;
        List<Usuario> usuarios;
        Ensayo ensayo = null;
        Usuario usuario = null;
        try {
            String tmp;
            tmp = nodo.getChildText("codigoEnsayo");

            utx.begin();
            Query q = em.createQuery("select object(o) from Ensayo as o where o.codigoEnsayo = :codigo");
            q.setParameter("codigo", tmp);
            utx.commit();
            ensayos = q.getResultList();
            if (ensayos.size() > 0)
                ensayo = ensayos.get(0);
            form.setCodigoEnsayo(ensayo);
            tmp = nodo.getChildText("fecha");
            date = df.parse(tmp);
            form.setFecha(date);
            tmp = nodo.getChildText("nroOT");
            form.setNroOT(new OrdenDeTrabajo(tmp));
            tmp = nodo.getChildText("rut");

            utx.begin();
            q = em.createQuery("select object(o) from Usuario as o where o.rut = :rut");
            q.setParameter("rut", tmp);
            utx.commit();
            usuarios = q.getResultList();
            if (usuarios.size() > 0)
                usuario = usuarios.get(0);

            form.setRut(usuario);
            tmp = nodo.getChildText("ID_externo");
            form.setId_externo(Integer.parseInt(tmp));
            form.setEstado("En espera");

        } catch (ParseException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ex);
            throw new RuntimeException(ex);
        } finally {
            em.close();
        }

        return form;
    }

    private OrdenDeTrabajo getOt(Element nodo) {
        DateFormat df = new SimpleDateFormat("dd-MM-yy");
        OrdenDeTrabajo ot = new OrdenDeTrabajo();
        try {
            ot.setNroOT(nodo.getChildText("nroOT"));
            ot.setObra(Integer.parseInt(nodo.getChildText("obra")));
            ot.setEmpresa(Integer.parseInt(nodo.getChildText("estado")));
            ot.setFecha(df.parse(nodo.getChildText("fecha")));

        } catch (ParseException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ot;
    }

    @WebMethod(operationName = "getOrdenesDeTrabajo")
    public String getOrdenesDeTrabajo() {
        StringBuilder sb = new StringBuilder();
        Statement s;
        ResultSet rs;
        Connection connection = conectarBD();
        String nroOT = "";
        try {
            s = connection.createStatement();
            s.executeQuery("Select orden_trabajo.orden_trabajo, orden_trabajo.fecha, obra.id, empresa.id from orden_trabajo, empresa, obra where orden_trabajo.empresa = empresa.id and orden_trabajo.obra = obra.id");
            rs = s.getResultSet();
            sb.append("<ordenes>");
            while (rs.next()) {
                nroOT = rs.getString("orden_trabajo");
                if(!nroOT.contains("Anulada")){
                    sb.append("<orden>");
                    sb.append("<nroOT>" + rs.getString("orden_trabajo") + "</nroOT>");
                    sb.append("<obra>" + rs.getInt("obra.id") + "</obra>");
                    sb.append("<empresa>" + rs.getInt("empresa.id") + "</empresa>");
                    sb.append("<fecha>" + rs.getDate("fecha") + "</fecha>");
                    sb.append("</orden>");
                }
            }
            sb.append("</ordenes>");
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            System.out.println("Error:" + ex.toString());
        }
        return sb.toString();

    }

    @WebMethod(operationName = "getEmpresas")
    public String getEmpresas() {
        StringBuilder sb = new StringBuilder();
        Statement s;
        ResultSet rs;
        Connection connection = conectarBD();
        try {
            s = connection.createStatement();
            s.executeQuery("Select id,razon_social,rut from empresa");
            rs = s.getResultSet();
            sb.append("<empresas>");
            while (rs.next()) {
                sb.append("<empresa>");
                sb.append("<id>" + rs.getInt("id") + "</id>");
                sb.append("<razonSocial>" + rs.getString("razon_social") + "</razonSocial>");
                sb.append("<rut>" + rs.getString("rut") + "</rut>");
                sb.append("</empresa>");
            }
            sb.append("</empresas>");
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            System.out.println("Error:" + ex.toString());
        }
        return sb.toString().replace('&', 'y');
    }

    @WebMethod(operationName = "getEnsayos")
    public String getEnsayos() {
        StringBuilder sb = new StringBuilder();
        try {
            Statement s;
            ResultSet rs;
            String obras;
            Connection connection = conectarBD();
            s = connection.createStatement();
            s.executeQuery("Select id_ensayo, fecha, codigo  from ensayo,catalogo_ensayo where estado = 'En espera' and ensayo.id_catalogo_ensayo = catalogo_ensayo.id_catalogo_ensayo");
            rs = s.getResultSet();
            sb.append("<formularios>");
            while (rs.next()) {
                sb.append("<formulario>");
                sb.append("<id>" + rs.getInt("id_ensayo") + "</id>");
                sb.append("<fecha>" + rs.getDate("fecha") + "</fecha>");
                sb.append("<codigoEnsayo>" + codigoEnsayoRD(rs.getString("codigo")) + "</codigoEnsayo>");
                sb.append("</formulario>");
            }
            sb.append("</formularios>");

        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        }
        return sb.toString();
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "getObras")
    public String getObras() throws InstantiationException, IllegalAccessException {
        StringBuilder sb = new StringBuilder();
        Statement s;
        ResultSet rs;
        String obras;
        Connection connection = conectarBD();
        try {
            s = connection.createStatement();
            s.executeQuery("Select id,nombre from obra");
            rs = s.getResultSet();
            sb.append("<obras>");
            while (rs.next()) {
                sb.append("<obra>");
                sb.append("<nombre>" + rs.getString("nombre") + "</nombre>");
                sb.append("<id>" + rs.getInt("id") + "</id>");
                sb.append("</obra>");
            }
            sb.append("</obras>");
        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            System.out.println("Error:" + ex.toString());
        }
        return sb.toString();


    }

    private String codigoEnsayoRD(String codigo) {
        if (codigo.equals("A1")) {
            return "073";
        }
        if (codigo.equals("A2")) {
            return "031";
        }
        if (codigo.equals("A7")) {
            return "043";
        }
        if (codigo.equals("A6")) {
            return "057";
        }
        if (codigo.equals("A5")) {
            return "065";
        }
        if (codigo.equals("A9")) {
            return "087";
        }
        if (codigo.equals("S12")) {
            return "019";
        }
        if (codigo.equals("S11")) {
            return "092";
        }
        if (codigo.equals("H1")) {
            return "010";
        }
        return null;
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "getFormularios")
    public String getFormularios(@WebParam(name = "obra")
    int obra, @WebParam(name = "orden")
    String orden) {
        StringBuilder sb = new StringBuilder();
        try {
            Statement s, sOrden;
            ResultSet rs, rsOrden;
            String obras;
            Connection connection = conectarBD();
            s = connection.createStatement();
            sOrden = connection.createStatement();
            int orden_trabajo = 0;
            if(!orden.equals("")){
                s.executeQuery("select id from orden_trabajo where orden_trabajo = '"+ orden +"'");
                rs = s.getResultSet();

                if(rs.next())
                    orden_trabajo = rs.getInt("id");
            }
            if(orden_trabajo > 0 && obra > 0)
                s.executeQuery("Select ensayo.id_ensayo, ensayo.fecha, catalogo_ensayo.codigo, orden_trabajo.orden_trabajo, ensayo.obra from orden_trabajo,ensayo,catalogo_ensayo where ensayo.estado = 'En espera' and ensayo.id_catalogo_ensayo = catalogo_ensayo.id_catalogo_ensayo and orden_trabajo.obra = '" + obra +"' and ensayo.orden_de_trabajo = '"+ orden_trabajo +"' and ensayo.orden_de_trabajo = orden_trabajo.id");
            else if(orden_trabajo > 0 && obra == 0)
                s.executeQuery("Select ensayo.id_ensayo, ensayo.fecha, catalogo_ensayo.codigo, orden_trabajo.orden_trabajo, ensayo.obra from orden_trabajo,ensayo,catalogo_ensayo where ensayo.estado = 'En espera' and ensayo.id_catalogo_ensayo = catalogo_ensayo.id_catalogo_ensayo and ensayo.orden_de_trabajo = '"+ orden_trabajo +"' and ensayo.orden_de_trabajo = orden_trabajo.id");
            else if(orden_trabajo == 0 && obra > 0)
                s.executeQuery("Select ensayo.id_ensayo, ensayo.fecha, catalogo_ensayo.codigo, orden_trabajo.orden_trabajo, ensayo.obra from orden_trabajo,ensayo,catalogo_ensayo where ensayo.estado = 'En espera' and ensayo.id_catalogo_ensayo = catalogo_ensayo.id_catalogo_ensayo and orden_trabajo.obra = '" + obra +"' and ensayo.orden_de_trabajo = orden_trabajo.id");
            else if(obra == -1 && orden.equals(""))
                s.executeQuery("Select ensayo.id_ensayo, ensayo.fecha, catalogo_ensayo.codigo, orden_trabajo.orden_trabajo, ensayo.obra from ensayo,catalogo_ensayo,orden_trabajo where ensayo.estado = 'En espera' and ensayo.id_catalogo_ensayo = catalogo_ensayo.id_catalogo_ensayo and ensayo.orden_de_trabajo = orden_trabajo.id");
            rs = s.getResultSet();
            sb.append("<formularios>");
            while (rs.next()) {
                sb.append("<formulario>");
                sb.append("<id>" + rs.getInt("id_ensayo") + "</id>");
                sb.append("<fecha>" + rs.getDate("fecha") + "</fecha>");
                sb.append("<codigoEnsayo>" + codigoEnsayoRD(rs.getString("codigo")) + "</codigoEnsayo>");
                sb.append("<obra>" + rs.getInt("obra") + "</obra>");
                if(orden_trabajo == 0){
                    sOrden.executeQuery("select orden_trabajo from orden_trabajo,ensayo where ensayo.id_ensayo = '"+ rs.getInt("id_ensayo") +"' and orden_trabajo.id = ensayo.orden_de_trabajo");
                    rsOrden = sOrden.getResultSet();
                    if(rsOrden.next()){
                        sb.append("<orden>" + rsOrden.getString("orden_trabajo") + "</orden>");
                    }
                }else
                    sb.append("<orden>" + orden + "</orden>");
                sb.append("</formulario>");
            }
            sb.append("</formularios>");

        } catch (SQLException ex) {
            Logger.getLogger(ServicioWeb.class.getName()).log(Level.SEVERE, null, ex);
        }
        return sb.toString();
    }
}

